//
// Created by kepeiyang on 2021/3/10.
//

#include "TaskDao.h"
#include <kisql.h>
#include <list>
#include <tool/Util.h>

using std::string;
using std::list;

static kisql *db;
static MYSQL_RES *result;
static MYSQL_ROW row;

TaskDao *TaskDao::sInstance = new TaskDao();
TaskDao::TaskDao() {
    db = kisql::getInstance();
}
TaskDao::~TaskDao() {}
TaskDao* TaskDao::getInstance() {return sInstance;}

void TaskDao::getTask(string taskid, TaskBean &retTask) {
    string sql = "select * from renwu where rwid = "+ taskid;

    if(mysql_query(db->getMysql(), sql.c_str())){
        perror("mysql query err");
        return;
    } else{ //select success
        result = mysql_store_result(db->getMysql());
        if(result){
            int num_rows = mysql_num_rows(result);

            for(int i = 0; i < num_rows; i++) {
                row = mysql_fetch_row(result);
                if (row == nullptr) {
                    break;
                }

                retTask.setId(row[0]);
                retTask.setName(row[1]);
                retTask.setType(row[2]);
                retTask.setItem(row[3]);
                retTask.setEquipment(row[4]);
                retTask.setExp(row[5]);
                retTask.setYxb(row[6]);
                retTask.setRequest(row[7]);
                retTask.setInfo(row[8]);
                retTask.setCount(row[9]);
                retTask.setLx(row[10]);
                retTask.setYaopin(row[11]);
                retTask.setLastTaskId(row[12]);
                retTask.setTaskSkill(row[13]);
                cout << retTask.toString() << endl;
            }
        }
    }
}

/**
 * 获取玩家身上所有任务列表
 * @param sid 玩家的sid
 * @param taskid 任务id
 * @param RetTaskList 获取的任务列表
 */
void TaskDao::getPlayerTaskList(string sid, list<PlayerTaskBean> &RetTaskList){

    char sql[1024] = {0};
    sprintf(sql, R"(select * from playerrenwu where sid = "%s")", sid.c_str());

    if(mysql_query(db->getMysql(), sql)){
        perror("mysql query err");
        return;
    } else{ //select success
        result = mysql_store_result(db->getMysql());
        if(result){
            int num_rows = mysql_num_rows(result);

            for(int i = 0; i < num_rows; i++) {
                row = mysql_fetch_row(result);
                if (row == nullptr) {
                    break;
                }

                PlayerTaskBean *pTB = new PlayerTaskBean();

                pTB->setId(row[0]);
                pTB->setName(row[1]);
                pTB->setType(row[2]); //zl
                pTB->setItem(row[3]);
                pTB->setEquipment(row[4]);
                pTB->setExp(row[5]);
                pTB->setYxb(row[6]);
                //pTB->setSid(row[7]);
                pTB->setStatus(row[8]);
                pTB->setRequest(row[9]);
                pTB->setCount(row[10]);
                pTB->setNowcount(row[11]);
                pTB->setLx(row[12]);
                pTB->setYaopin(row[13]);
                pTB->setData(row[14]);
                pTB->setSkill(row[15]);

                //cout << pTB->toString() << endl;
                RetTaskList.push_back(*pTB);
            }
        }
    }
}

/**
 * 获取玩家身上单个任务
 * @param sid 玩家sid
 * @param taskid 任务id
 * @param RetTaskList 获取的任务
 */
bool TaskDao::getPlayerTaskOnce(string sid, string taskid, PlayerTaskBean &RetTaskList){
    char sql[1024] = {0};
    sprintf(sql, R"(select * from playerrenwu where sid="%s" and rwid=%s)", sid.c_str(), taskid.c_str());

    if(mysql_query(db->getMysql(), sql)){
        perror("mysql query err");
        return false;
    } else{ //select success
        result = mysql_store_result(db->getMysql());
        if(result) {
            int num_rows = mysql_num_rows(result);

            for (int i = 0; i < num_rows; i++) {
                row = mysql_fetch_row(result);
                if (row == nullptr) {
                    break;
                }

                RetTaskList.setId(row[0]);
                RetTaskList.setName(row[1]);
                RetTaskList.setType(row[2]); //zl
                RetTaskList.setItem(row[3]);
                RetTaskList.setEquipment(row[4]);
                RetTaskList.setExp(row[5]);
                RetTaskList.setYxb(row[6]);
                //pTB->setSid(row[7]);
                RetTaskList.setStatus(row[8]);
                RetTaskList.setRequest(row[9]);
                RetTaskList.setCount(row[10]);
                RetTaskList.setNowcount(row[11]);
                RetTaskList.setLx(row[12]);
                RetTaskList.setYaopin(row[13]);
                RetTaskList.setData(row[14]);
                RetTaskList.setSkill(row[15]);
                return true;
                //cout << RetTaskList.toString() << endl;
            }
        }
    }
    return false;
}

/**
 * 接受任务
 * @param sid 玩家sid
 * @param task 接受的任务
 * @return 添加是否成功
 */
bool TaskDao::addPlayerTask(string sid, TaskBean task) {
    char sql[1024] = {0};

    sprintf(sql, R"(insert into playerrenwu(rwname,rwzl,rwdj,rwzb,rwexp,rwyxb,sid,rwzt,rwid,rwyq,rwcount,rwlx,rwyp,rwjineng,`data`) VALUES("%s", %s, "%s", "%s", "%s", "%s", "%s", %s, %s, %s, %s, %s,"%s", "%s", "%s"))",
        task.getName().c_str(), task.getType().c_str(), task.getItem().c_str(), task.getEquipment().c_str(), task.getExp().c_str(),
        task.getYxb().c_str(), sid.c_str(), "1", task.getId().c_str(), task.getRequest().c_str(), task.getCount().c_str(),
        task.getLx().c_str(),task.getYaopin().c_str(),"0", Util::getTime().c_str());

    cout << "test :" << sql << endl;

    if(mysql_query(db->getMysql(), sql)){
        perror("mysql query err");
        return false;
    }else{ //select success
        //update insert delete
        if(mysql_field_count(db->getMysql()) == 0){
            return true;
        }
    }
    return false;
}

/**
 * 更新任务状态
 * @param sid 玩家sid
 * @param taskid 任务id
 * @param taskStatus 更新的任务状态
 * @param taskOver 该任务是否完成
 * @return 执行是否成功
 */
bool TaskDao::updateTaskStatus(string sid, string taskid, string taskStatus, int taskOver) {
    char sql[1024] = {0};

    if(!taskOver)
    {
        sprintf(sql, R"(update playerrenwu set rwzt=%s where rwid=%s and sid="%s")",
                taskStatus.c_str(), taskid.c_str(), sid.c_str());
    }else{
        sprintf(sql, R"(update playerrenwu set rwzt=%s,././rwnowcount=0 where rwid=%s and sid="%s")",
                taskStatus.c_str(), taskid.c_str(), sid.c_str());
    }

    if(mysql_query(db->getMysql(), sql)){
        perror("mysql query err");
        return false;
    }else{ //select success
        //update insert delete
        if(mysql_field_count(db->getMysql()) == 0){
            return true;
        }
    }
    return false;
}
